<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    "use strict";

    // JS是弱类型的语言, JS语法中存在很多不合理,不严谨, 不安全的地方 (传统模式)  


    // ES5 严格模式 => 目的:消除JS语法中的不合理,不严谨,不安全的地方, 为未来版本做准备

    // 优点:
    // 消除JS语法中的不合理,不严谨,不安全的地方, 为未来版本做准备
    // 提高代码的执行效率,减少不规范行为

    // 如何进入严格模式?  => 在作用域最前面加字符串 "use strict";
    // 全局作用域  => 当前脚本的最前面加 "use strict"
    // 函数作用域  => 函数所有内容的最前面加 "use strict"


    // var a = 10;
    // b = 20;
    // console.log(a,b);


    // function fn(){
    //     "use strict";
    //     var a = 10;
    //     b = 20;
    //     console.log(a,b);
    // }

    // fn();


    // (1) 严格模式中, 声明变量需要通过关键词var, 不通过关键词声明变量会报错
    // var a = 10;
    // b = 20;
    // console.log(a,b);

    // (2) 严格模式中, 新增eval()作用域, 在eval作用域中声明的变量也是局部的 
    // debugger
    // eval(" var a = 10;var b=20; var c = a + b;console.log(a,b,c)");
    // console.log(a,b,c);


    // (3) 严格模式中, 函数的参数名不允许重复声明， 重复声明会报错
    // function sum(a, b, b) {
    //     // a = 1;
    //     // b = 2;
    //     // b = 3;
    //     return a + b;
    // }

    // var result = sum(1, 2, 3);
    // console.log(result);


    // (4) 严格模式中,要求函数调用时要有依存的对象, 如果没有依存的对象this默认指向undefined

    // function fn(){
    //     console.log(this);
    // }

    // fn(); // this-> undefiend  (本次函数调用时没有依存的对象)
    // window.fn();  // this -> window  (本次函数调用时通过window调用 => 有依存的对象)


    // (5) 严格模式中,如果对象的属性不允许被删除,强制删除会报错

    var zhang = {};
    Object.defineProperties(zhang, {
        name: {
            value: "张三",  // 新增属性的属性值
            writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
            enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
            configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
        },
        age: {
            value: 18,  // 新增属性的属性值
            writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
            enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
            configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
        },
        height: {
            value: "177cm",  // 新增属性的属性值
            writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
            enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
            configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
        },
        weight: {
            value: "65kg",  // 新增属性的属性值
            writable: false, // 属性是否可以被修改 (对应键名修改健值) => 默认false
            enumerable: false, // 属性是否可以枚举(循环遍历)  => 默认false
            configurable: false,  // 属性是否可以被重新配置或删除  => 默认false  
        }
    })

    console.log(delete zhang.name);

</script>

</html>